import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 使用ThreadPoolExecutor创建一个忽略最新任务的线程池，创建规则：
 * 1.核心线程数为5
 * 2.最大线程数为10
 * 3.任务队列为100
 * 4.拒绝策略为忽略最新任务
 * 5. 自己写的
 *      AbortPolicy：中止策略，线程池会抛出异常并中止执行此任务；
 *      CallerRunsPolicy：把任务交给添加此任务的线程来执行；
 *      DiscardPolicy：忽略此任务（最新加入的任务）；
 *      DiscardOldestPolicy：忽略最先加入队列的任务（最老的任务）。
 *
 */
public class Test2 {
    public static void main(String[] args) {
        // 标准库的线程池.
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5,//核心线程数
                10, // 最大线程数
                1,  // 线程的最大空闲时间
                TimeUnit.SECONDS, // 空闲时间的单位
                new LinkedBlockingQueue<>(100), // 给常量池传入一个任务队列
                new ThreadPoolExecutor.DiscardPolicy()); // 拒绝策略. 忽略此任务（最新加入的任务）

        // 测试
        for (int i = 0; i < 10; i++) {
            Thread t = new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "已执行.");
            });
            t.start();
        }

        for (int i = 0; i < 1200; i++) { // 添加1200个任务, 但是任务队列只能放100个任务.
            int k = i;                   // 所以在添加任务时,如果队列满了, 就会忽略此任务, 直到有线程将队列的任务执行了(此时
                                         // 队列不是满的了),才把此时添加的任务添加到任务队列中等待线程执行
            poolExecutor.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(k);
                }
            });
        }
    }
}
